Ora si estenderà il modello della sessione precedente includendo periodi di tempo multipli. Un nuovo Indice del Periodo è inserito nel modello per soddisfare questi periodi di tempo e quindi aggiornare i vari vettori che sono stati coinvolti dal nuovo dominio.
Per aggiornare il vostro modello cosi' che includa un periodo multiplo, avrete bisogno di creare un indice che rappresenti il tempo di quel periodo. Questo tipo di indice è chiamato period index. Dopo che avrete definito l'indice del vostro periodo, potrete usarlo per aggiornare i dati, vettori di variabile e di vincolo per includere uno specifico periodo di tempo. Esempi d' indici di periodo potrebbero includere: months, quarters, e years.
Quando state aggiornando un modello da un singolo periodo a periodi multipli, le vendite per uno specifico periodo potrebbero differire dalla quantità prodotta nello stesso periodo. Come risultato,è necessaria una nuova variabile che rappresenti quanto si necessiti vendere, e una nuova variabile che rappresenti il livello d' inventario per ogni periodo.
In molti casi, c'e' un costo fisso per il periodo implicato con l'inventario immaggazinato. In altri casi, tuttavia, il costo potrebbe non combaciare con l'attuale immaggazinamento dell'inventario, ma piuttosto con l'immaggazinamento e la rimozione dei prodotti dall'inventario del magazzino, attraverso i costi di lavoro implicati.Questo significa che si necessiterebbe di piu' variabili al modello, una per immagazzinare i prodotti e un'altra per rimuoverli dall'inventario.
Dato che non è possibile vendere più prodotti di quanti se ne possieda, la variabile dell'inventario è usata per connettere le variabili di produzione alle variabili di vendita. Questo è fatto attraverso un tipo di vincolo, tipicamente chiamato balance constraint. Vincoli d'equilibrio sono usati per assicurarsi che le quantità in entrata siano di entità uguale alle quantità in uscita.
Un tipico vincolo d' equilibrio, stipula che la produzione totale, più il livello dell'inventario dal periodo precedente , equalizzi la quantità venduta, più quanto si lascia nell'inventario. Un esempio di vincolo d' equilibrio è:
Produce + Inventory[month-1] = Sales + Inventory
In questo caso, l'entità che viene equilibrata è l'inventario.Invt[month-1] è un'annotazione usata in MPL per rappresentare il periodo precedente. Quando si lavora con un inventario dove il costo necessita di essere applicato all'immagazzinamento e alla rimozione dell'inventario, si avrà bisogno di definire due vincoli di equilibrio.Per esempio:
Produce + OutInvt = Sales + PutInvt PutInvt + Inventory[month-1] = OutInvt + Inventory
Se si pensa alla pianta come un'entità, nel primo vincolo stiamo equilibrando ciò che va con la pianta con ciò che va fuori. Nella stessa maniera, il secondo vincolo equilibra ciò che va dentro, e ciò che va fuori dall'inventario.
In molti casi il modello di sviluppo necessita di specificare uno specifico inventario iniziale o finale per il periodo progettato. MPL per difetto esclude le entrate dell' Inventory[month-1] per il mese uguale a zero. Ci sono varie via con cui si può specificare un inventario iniziale, per esempio si può introdurre il vincolo in due parti come segue:
INDEX month := (Jan, Feb, Mar, Apr) DATA StartInvt := 450 SUBJECT TO InitInvt[month=Jan]: produce + StartInvt = sales + Inventory InvtBal [month>Jan]: produce + Inventory[month-1] = sales + Inventory
Questo creerà un vincolo di bilancio per il mese di Gennaio con l'inventario iniziale di 450 unità.Ci sono altre vie per includere un inventario di partenza in MPL che non richiedono che si duplichi il vincolo, per esempio con i sottoindici, ma questa è la via più semplice per formulare questi tipi di vincoli.
In questa sessione si creerà la formulazione di un nuovo modello di pianificazione per la produzione multi-periodo. Si userà il modello creato nella sessione 3, e si faranno le necessarie aggiunte e aggiornatmenti ad essa.
In questo nuovo problema, si ha un periodo pianificato di quattro mesi, da Gennaio ad Aprile.Si ha bisogno di creare un indice che contenga i quattro mesi menzionati, e poi aggiornare il resto del modello di conseguenza, aggiungendo l'indice ai vettori definiti.
Come nel problema della Sessione 3, il prezzo di vendita per ogni prodotto è ancora $120.00, $100.00, $115.00, rispettivamente. Ora,invece di avere una singola domanda per ogni prodotto, si hanno domande separate per ogni prodotto e ogni mese, come dato nella tabella sottostante:
Production Demand | Jan | Feb | Mar | Apr |
---|---|---|---|---|
A1 | 4300 | 4200 | 6400 | 5300 |
A2 | 4500 | 5400 | 6500 | 7200 |
A3 | 5400 | 6700 | 7800 | 8200 |
Il tasso di produzione e il costo di produzione rimane lo stesso, come dato nella tabella della sessione 3. Si noti che i giorni di produzione disponibili sono differenti per ogni mese con 23 giorni per Gennaio, 20 per Febbraio, 23 per Marzo e 22 per Aprile.
S' introdurrà l'inventario nel modello, quindi, si ha il costo dell'inventario per ogni prodotto con A1 $3.50/month , A2 -$4.00/month e A3 - $3.00/month, ripettivamente.
Ogni prodotto occupa la stessa quantità di spazio, ma la capacità totale dell'inventario è ora di 800 unità al mese.
La lista sottostante è l'intera formulazione del modello per Planning4. Come si può vedere il modello è cresciuto rispetto alla Sessione 3. Le aggiunte la modello sono sottolineate in neretto così che sia più semplice vedere i cambiamenti.
TITLE Production_Planning4; INDEX product := (A1, A2, A3); month := (Jan, Feb, Mar, Apr); DATA Price[product] := (120.00, 100.00, 115.00); Demand[product, month] := (4300, 4200, 6400, 5300, 4500, 5400, 6500, 7200, 5400, 6700, 7800, 8200); ProdCost[product] := (73.30, 52.90, 65.40); ProdRate[product] := (500, 450, 550); ProdDaysAvail[month] := (23, 20, 23, 22); InvtCost[product] := (3.50, 4.00, 3.00); InvtCapacity := 800; VARIABLES Produce[product, month] -> Prod; Inventory[product,month] -> Invt; Sales[product, month] -> Sale; MACROS TotalRevenue := SUM(product, month: Price * Sales); TotalProdCost := SUM(product, month: ProdCost * Produce); TotalInvtCost := SUM(product, month: InvtCost * Inventory); TotalCost := TotalProdCost + TotalInvtCost; MODEL MAX Profit = TotalRevenue - TotalCost; SUBJECT TO ProdCapacity[month] -> PCap: SUM(product: Produce / ProdRate) <= ProdDaysAvail; InvtBal[product, month] -> IBal: Produce + Inventory[month-1] = Sales + Inventory; MaxInventory[month] -> MaxI: SUM(product: Inventory) <= InvtCapacity; BOUNDS Sales <= Demand; END
Eseguire l'applicazione MPL.
Scegliere File | Open e aprire il modello dalla sessione precedente Planning3.mpl.
Scegliere File | Save As per salvarlo come nuovo file del modello Planning4.mpl.
Cambiare il titolo per il modello per sottolineare che si sta lavorando con il modello Planning4:
TITLE Production_Planning4;
In questo esempio, c'e' un periodo pianificato di quattro mesi. Create un nuovo indice chiamato month. Questo indice avrà quattro elementi Jan, Feb, Mar, e Apr, per rappresentare il periodo pianificato di quattro mesi. Aggiungete la definizione seguente per l'indice month, che è sottolineato in neretto, alla sezione INDEX :
INDEX product := (A1, A2, A3); month := (Jan, Feb, Mar, Apr);
Nella sezione DATA , la maggior parte delle definizioni di dati sono le stesse della Sessione 3. Uno dei vettori di dati ; Demand, necessita di essere aggiornato per includere l'indice month , così ora ha differenti valori per ogni mese.I valori per questo vettore sono dati nella tabella nella descrizione del problema precedentemente in questa sessione. Si aggiunga l'indice month come dichiarazione per il vettore di dati Demand, seguito con una lista di valori di dati come mostrato di seguito:
DATA Price[product] := (120.00, 100.00, 115.00); Demand[product,month] := (4300, 4200, 6400, 5300, 4500, 5400, 6500, 7200, 5400, 6700, 7800, 8200);
La costante di dati ProdDaysAvail ora ha un valore differente per ogni mese, come nel vettore di dati Demand . Questo significa che necessita di essere aggiornato da una costante di dati a un vettore di dati dimensionali, con month come indice . Usando la lista di produzione dei giorni disponibili, trovata nella descrizione precedentemente in questa sessione, aggiornate il ProdDaysAvail come segue:
ProdCost[product] := (73.30, 52.90, 65.40); ProdRate[product] := (500, 450, 550); ProdDaysAvail[month] := (23, 20, 23, 22);
La descrizione del problema ha definito un costo per ogni prodotto immagazzinato nell'inventario e un limite di quanto possa essere imagazzinato nell'inventario.Quindi,per rappresentare questo, aggiungere un vettore di dati in piu' al modello; InvtCost, e anche una nuova costante di dati, InvtCapacity. Alla fine della sessione DATA aggiungere le definizioni seguenti:
InvtCost[product] := (3.50, 4.00, 3.00); InvtCapacity := 800;
Con questo modello ci sono due nuove variabili,Sales e Inventory,(Vendite e Inventario) che necessitano di essere introdotte nel modello.La variabile Sales è usata per rappresentare quanto di ogni prodotto è venduto ogni mese.La variabile Inventory è usata per rappresentare quanto di ogni prodotto è immagazzinato, ogni mese. La variabile Produce necessita di essere aggiornata per includere l'indice month come differenti importi di ogni prodotto che viene prodotto, ogni mese. Nel modello si aggiunga le seguenti definizioni VARIABLES:
VARIABLES Produce[product, month] -> Prod; Inventory[product,month] -> Invt; Sales[product, month] -> Sale;
Come nel modello precedente, il nome che appare dopo il segno '->' (read becomes) è un'abbreviazione opzionale del nome del vettore. Questo è usato per sfalsare le limitazione di misura del nome della variabile di molti LP solvers.
Nel modello dalla sessione precedente, il totale reddito e il costo totale della produzione sono inclusi nella funzione obiettiva. Ora si necessita di aggiornare questa funzione obiettiva con l'indice; month, e aggiungere un'entrata per il costo totale dell'inventario. Come nella sessione precedente, si continuerà ad usare macros per rappresentare ogni sommatoria.
Quando si calcola il reddito totale, si necessita di riferirsi alla variabile Sales invece che alla variabile Produce e aggiungere l'indice month alla sommatoria. Per il costo totale della produzione , si avra' anche bisogno di aggiornare la sommatoria per includere l'indice month. Il costo totale dell'inventario sarà definito, come il costo dell'inventario, periodi del livello dell'inventario, per ogni product e month.
Per fare dei cambiamenti nella sessione MACROS, sostituire la variabile Produce con la variabile Sales, aggiornare il reddito totale e le sommatorie del costo totale di produzione per includere l'indice month, e aggiungere una nuova definizione macro per il costo totale dell'inventario come segue:
MACROS TotalRevenue := SUM(product, month: Price * Sales); TotalProdCost := SUM(product, month: ProdCost * Produce); TotalInvtCost := SUM(product, month: InvtCost * Inventory); TotalCost := TotalProdCost + TotalInvtCost;
Per favore si noti che macro per il costo totale della produzione e' stato rinominato TotalProdCost. Un'altra nuova macro; TotalCost, e'stata aggiunta dove si può sommare insieme queste due macros per ottenere il costo totale.Questo permette alla definizione della funzione obiettiva di rimanere invariata:
MODEL MAX Profit = TotalRevenue - TotalCost;
Nel vincolo production capacity , aggiungere l'indice month alla definizione di vinclo e il resto del vincolo rimane lo stesso.
SUBJECT TO ProdCapacity[month] -> PCap: SUM(product: Produce / ProdRate) <= ProdDaysAvail;
Per favore si noti che in MPL non si deve introdurre ogni indice sottoscritto quando riferito al data e ai vettori di variabile. Questo significa che si può facilmente aggiungere più indici ai vincoli senza dover cambiare ci si riferisce ad ogni vettore.
L'aggiunta della variabile Inventory al modello necessita d'includere un vincolo standard di equilibrio dell'inventario.Questo vincolo fluttua su ogni prodotto e ogni mese, specificando che la produzione, più l'inventario per il mese precedente, è equal alla quantità venduta, più l'inventario per il mese corrente. Aggiungere il seguenteto InvtBal vincolo sottostante al precedente vincolo ProdCapacity:
InvtBal[product, month] -> IBal: Produce + Inventory[month-1] = Sales + Inventory;
Quando si introduce i periodi di tempo, come in questo caso il mese precedente, MPL permette di usare un' espressione come [month-1].
C'e' un limite su quanto spazio disponibile c'e' per un inventario.Quindi, bisogno aggiungere un vincolo di capacità d'inventario al modello. Nella descrizione del problema, Vi e' stato detto che ogni prodotto orende un uguale quantità di spazio nell'inventario e che si può aggiungere , o sommare sopra tutti i prodotti per far si' che tutto lo spazio dell'inventario sia usato. Aggiungere la seguente definizione di vincolo al modello:
MaxInventory[month] -> MaxI: SUM(product: Inventory) <= InvtCapacity;
Nel limite superiore della massima domanda si necessita di aggiornarlo per includere la variabile Sales (Vendite) invece della variabile Produce (Prodotto) come mostrato qui sotto:
BOUNDS Sales <= Demand;
Dopo aver finito d'introdurre il modello, si dovrebbe salvarlo scegliendo Save (Salvare) dal menu File (Archivio).
Il prossimo passo è risovere il modello Planning4, scegliendo Solve CPLEXdal menu Run. Se si è introdotto i dati correttamente, MPL visualizzerà il messaggio Optimal Solution Found (Soluzione ottimale trovata). Se c'è una finestra d'errore, con un errore di sintassi, per favore controllare la formulazione introdotta con il modello dettagliato prima nella sessione:
Dopo aver risolto il modellol MPL automaticamente crea un file standard di soluzione chiamato 'Planning4.sol'. Si piuò visulaizzare il file di soluzione in una finestra di vista premendo il bottone View (Vista) nella parte inferiore della Status Window (Finestra della stato). Una lista completa di soluzioni è mostrata sotto:
MPL Modeling System - Copyright (c) 1988-2001, Maximal Software, Inc. -------------------------------------------------------------------------------- MODEL STATISTICS Problem name: Production_Planning4 Filename: Planning4.mpl Date: April 17, 1998 Time: 22:52 Parsing time: 0.15 sec Solver: CPLEX Objective value: 2246007.27273 Iterations: 26 Solution time: 0.04 sec Constraints: 20 Variables: 36 Nonzeros: 69 Density: 10 % SOLUTION RESULT Optimal solution found MAX Profit = 2246007.2727 MACROS Macro Name Values ----------------------------------------------- TotalRevenue 5386045.4545 TotalProdCost 3139078.1818 TotalInvtCost 960.0000 TotalCost 3140038.1818 ----------------------------------------------- DECISION VARIABLES VARIABLE Produce[product,month] : product month Activity Reduced Cost ---------------------------------------------------- A1 Jan 4300.0000 0.0000 A1 Feb 4200.0000 0.0000 A1 Mar 4409.0909 0.0000 A1 Apr 3545.4545 0.0000 A2 Jan 1800.0000 0.0000 A2 Feb 0.0000 -3.6667 A2 Mar 0.0000 -4.7889 A2 Apr 0.0000 -0.7889 A3 Jan 5720.0000 0.0000 A3 Feb 6380.0000 0.0000 A3 Mar 7800.0000 0.0000 A3 Apr 8200.0000 0.0000 ---------------------------------------------------- VARIABLE Inventory[product,month] : product month Activity Reduced Cost ---------------------------------------------------- A1 Jan 0.0000 -0.2000 A1 Feb 0.0000 -2.4900 A1 Mar 0.0000 -3.5000 A1 Apr 0.0000 -123.5000 A2 Jan 0.0000 -4.0000 A2 Feb 0.0000 -4.0000 A2 Mar 0.0000 0.0000 A2 Apr 0.0000 -108.0000 A3 Jan 320.0000 0.0000 A3 Feb 0.0000 -2.0818 A3 Mar 0.0000 -3.0000 A3 Apr 0.0000 -110.8545 ---------------------------------------------------- VARIABLE Sales[product,month] : product month Activity Reduced Cost ---------------------------------------------------- A1 Jan 4300.0000 4.3100 A1 Feb 4200.0000 1.0100 A1 Mar 4409.0909 0.0000 A1 Apr 3545.4545 0.0000 A2 Jan 1800.0000 0.0000 A2 Feb 0.0000 0.0000 A2 Mar 0.0000 0.0000 A2 Apr 0.0000 -4.0000 A3 Jan 5400.0000 11.0636 A3 Feb 6700.0000 8.0636 A3 Mar 7800.0000 7.1455 A3 Apr 8200.0000 7.1455 ---------------------------------------------------- CONSTRAINTS CONSTRAINT ProdCapacity[month] : month Slack Shadow Price ------------------------------------------- Jan 0.0000 -21195.0000 Feb 0.0000 -22845.0000 Mar 0.0000 -23350.0000 Apr 0.0000 -23350.0000 ------------------------------------------- CONSTRAINT InvtBal[product,month] : product month Slack Shadow Price ---------------------------------------------------- A1 Jan 0.0000 115.6900 A1 Feb 0.0000 118.9900 A1 Mar 0.0000 120.0000 A1 Apr 0.0000 120.0000 A2 Jan 0.0000 100.0000 A2 Feb 0.0000 100.0000 A2 Mar 0.0000 100.0000 A2 Apr 0.0000 104.0000 A3 Jan 0.0000 103.9364 A3 Feb 0.0000 106.9364 A3 Mar 0.0000 107.8545 A3 Apr 0.0000 107.8545 ---------------------------------------------------- CONSTRAINT MaxInventory[month] : month Slack Shadow Price ------------------------------------------- Jan 480.0000 0.0000 Feb 800.0000 0.0000 Mar 800.0000 0.0000 Apr 800.0000 0.0000 ------------------------------------------- END
In accordo con la soluzione, il profitto è ora $2.2M che è considerevolmente più alto di quanto non fosse nel modello Planning3, come stiamo lavorando ora con quattro mesi. Questo viene dal reddito totale di $5.4M e un costo totale di $3.1M, la maggior parte di questo è il costo di produzione, most of which is the production cost, come manteniamo un inventario molto basso solo per Gennaio.
Se si guarda alla variabileProduce (Prodotto) nella soluzione, si noterà che stiamo producendo prodotti A1 e A3 per l'itero periodo pianificato, sebbene non sempre sulla domanda totale. Il prodotto A2, in un altro senso, on the other hand, ha prodotto solo 1800 unità in Gennaio poichè non abbiamo abbastanza capacità di produrre tutti e tre i prodotti.
In Gennaio, il modello ha deciso di produrre 320 unità extra di A3, sulla domanda richiesta, al fine di metterne sufficiente nell'inventario per soddisfare la domanda in Febbraio.